home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src890906.arc / TRACE.C < prev    next >
C/C++ Source or Header  |  1989-09-07  |  3KB  |  158 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "iface.h"
  6. #include "trace.h"
  7.  
  8. static void ascii_dump __ARGS((struct mbuf **bpp));
  9. static void ctohex __ARGS((char *buf,int16 c));
  10. static void fmtline __ARGS((int16 addr,char *buf,int16 len));
  11. static void hex_dump __ARGS((struct mbuf **bpp));
  12.  
  13. /* Redefined here so that programs calling dump in the library won't pull
  14.  * in the rest of the package
  15.  */
  16. static char nospace[] = "No space!!\n";
  17.  
  18. void
  19. dump(iface,direction,type,bp)
  20. register struct iface *iface;
  21. int direction;
  22. unsigned type;
  23. struct mbuf *bp;
  24. {
  25.     struct mbuf *tbp;
  26.     void (*func) __ARGS((struct mbuf **,int));
  27.     int16 size;
  28.  
  29.     if(iface == NULL || (iface->trace & direction) == 0)
  30.         return;    /* Nothing to trace */
  31.  
  32.     switch(direction){
  33.     case IF_TRACE_IN:
  34.         if((iface->trace & IF_TRACE_NOBC)
  35.          && (Tracef[type].addrtest != NULLFP)
  36.          && (*Tracef[type].addrtest)(iface,bp) == 0)
  37.             return;        /* broadcasts are suppressed */
  38.         printf("%s recv:\n",iface->name);
  39.         break;
  40.     case IF_TRACE_OUT:
  41.         printf("%s sent:\n",iface->name);
  42.         break;
  43.     }
  44.     if(bp == NULLBUF || (size = len_mbuf(bp)) == 0){
  45.         printf("empty packet!!\n");
  46.         return;
  47.     }
  48.  
  49.     if(type < NLTYPE)
  50.         func = Tracef[type].tracef;
  51.     else
  52.         func = NULLVFP;
  53.  
  54.     dup_p(&tbp,bp,0,size);
  55.     if(tbp == NULLBUF){
  56.         printf(nospace);
  57.         return;
  58.     }
  59.     if(func != NULLVFP)
  60.         (*func)(&tbp,1);
  61.     if(iface->trace & IF_TRACE_ASCII){
  62.         /* Dump only data portion of packet in ascii */
  63.         ascii_dump(&tbp);
  64.     } else if(iface->trace & IF_TRACE_HEX){
  65.         /* Dump entire packet in hex/ascii */
  66.         free_p(tbp);
  67.         dup_p(&tbp,bp,0,len_mbuf(bp));
  68.         if(tbp != NULLBUF)
  69.             hex_dump(&tbp);
  70.         else
  71.             printf(nospace);
  72.     }
  73.     free_p(tbp);
  74. }
  75.  
  76. /* Dump an mbuf in hex */
  77. static void
  78. hex_dump(bpp)
  79. register struct mbuf **bpp;
  80. {
  81.     int16 n;
  82.     int16 address;
  83.     char buf[16];
  84.  
  85.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  86.         return;
  87.  
  88.     address = 0;
  89.     while((n = pullup(bpp,buf,sizeof(buf))) != 0){
  90.         fmtline(address,buf,n);
  91.         address += n;
  92.     }
  93. }
  94. /* Dump an mbuf in ascii */
  95. static void
  96. ascii_dump(bpp)
  97. register struct mbuf **bpp;
  98. {
  99.     char c;
  100.     register int16 tot;
  101.  
  102.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  103.         return;
  104.  
  105.     tot = 0;
  106.     while(pullup(bpp,&c,1) == 1){
  107.         if((tot % 64) == 0)
  108.             printf("%04x  ",tot);
  109.         putchar(isprint(c) ? c : '.');
  110.         if((++tot % 64) == 0)
  111.             printf("\n");
  112.     }
  113.     if((tot % 64) != 0)
  114.         printf("\n");
  115. }
  116. /* Print a buffer up to 16 bytes long in formatted hex with ascii
  117.  * translation, e.g.,
  118.  * 0000: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f  0123456789:;<=>?
  119.  */
  120. static void
  121. fmtline(addr,buf,len)
  122. int16 addr;
  123. char *buf;
  124. int16 len;
  125. {
  126.     char line[80];
  127.     register char *aptr,*cptr;
  128.     register char c;
  129.  
  130.     memset(line,' ',sizeof(line));
  131.     ctohex(line,hibyte(addr));
  132.     ctohex(line+2,lobyte(addr));
  133.     aptr = &line[6];
  134.     cptr = &line[55];
  135.     while(len-- != 0){
  136.         c = *buf++;
  137.         ctohex(aptr,(int16)uchar(c));
  138.         aptr += 3;
  139.         c &= 0x7f;
  140.         *cptr++ = isprint(c) ? c : '.';
  141.     }
  142.     *cptr++ = '\r';
  143.     *cptr++ = '\n';
  144.     fwrite(line,1,(unsigned)(cptr-line),stdout);
  145. }
  146. /* Convert byte to two ascii-hex characters */
  147. static
  148. void
  149. ctohex(buf,c)
  150. register char *buf;
  151. register int16 c;
  152. {
  153.     static char hex[] = "0123456789abcdef";
  154.  
  155.     *buf++ = hex[hinibble(c)];
  156.     *buf = hex[lonibble(c)];
  157. }
  158.